package fr.ul.ade.maquette.ui;

import java.util.Random;

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;

import com.actionbarsherlock.app.SherlockListFragment;

import fr.ul.ade.maquette.R;

/**
 * Fragment affichant la liste des emplois du temps.
 * 
 * @author Michaël Schnell
 * @since Jun 10, 2013
 * 
 * @version 1.0
 */
public class ScheduleListFragment
		extends SherlockListFragment
		implements OnItemLongClickListener {

	OnScheduleActionListener mListener;

	/**
	 * Crée une nouvelle instance.
	 * 
	 * @return Instance créée
	 */
	public static ScheduleListFragment newInstance() {
		return new ScheduleListFragment();
	}

	/**
	 * Attache l'adaptateur à la liste une fois la vue créée.
	 */
	@Override
	public void onViewCreated(android.view.View view, Bundle savedInstanceState) {
		super.onViewCreated(view, savedInstanceState);
		setListAdapter(new ScheduleListAdapter(this));
		getListView().setOnItemLongClickListener(this);
	}

	@Override
	public void onActivityCreated(Bundle savedInstanceState) {
		super.onActivityCreated(savedInstanceState);
		this.mListener = (OnScheduleActionListener) this.getActivity();
	}

	@Override
	public void onListItemClick(ListView l, View v, int position, long id) {
		this.mListener.showSchedule(position);
	}

	/**
	 * Active l'action mode pour cet emploi du temps suite à un clic long sur
	 * l'item qui affiche cet emploi du temps.
	 */
	@Override
	public boolean onItemLongClick(AdapterView<?> parent, View view,
			int position, long id) {
		this.mListener.showScheduleDetails(position);
		return true;
	}

	/**
	 * Adaptateur utilisée pour la liste. Contient les données codées en dur.
	 */
	static class ScheduleListAdapter
			extends BaseAdapter {

		ScheduleListFragment fragment;

		int[] status;
		boolean[] change;
		String[] name;
		String[] description;

		public ScheduleListAdapter(ScheduleListFragment fragment) {
			this.fragment = fragment;
			name = new String[] { "Numéro étudiant", "Salles infos", "Master",
					"Très long titre pour un emploi du temps" };
			description = new String[] { "Test", "Batiment premier cycle", "",
					"Très longue description pour un emploi du temps" };
			status = new int[name.length];
			change = new boolean[name.length];
			Random rnd = new Random();
			for (int i = 0; i < status.length; i++) {
				status[i] = rnd.nextInt(7);
				change[i] = rnd.nextBoolean();// && rnd.nextBoolean();
			}
		}

		@Override
		public int getCount() {
			return name.length;
		}

		@Override
		public Object getItem(int position) {
			return null;
		}

		@Override
		public long getItemId(int position) {
			return position;
		}

		/**
		 * Crée une vue pour un item.
		 * 
		 * @param position
		 *            position de l'item concerné
		 * 
		 * @param convertView
		 *            contient une ancienne vue qui peut être recyclée si elle
		 *            n'est pas égale à {@code null}.
		 * 
		 * @param parent
		 *            parent de la vue créée
		 * 
		 * @return vue créée
		 */
		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			if (convertView == null) {
				convertView = LayoutInflater.from(fragment.getActivity())
						.inflate(R.layout.schedule_list_item, null);
				final ViewHolder holder = new ViewHolder();
				holder.status = (ImageView) convertView
						.findViewById(R.id.schedule_status);
				holder.name = (TextView) convertView
						.findViewById(R.id.schedule_name);
				holder.description = (TextView) convertView
						.findViewById(R.id.schedule_description);
				holder.change = (ImageView) convertView
						.findViewById(R.id.schedule_big_change);
				convertView.setTag(holder);
			}

			final ViewHolder holder = (ViewHolder) convertView.getTag();
			holder.position = position;
			holder.name.setText(name[position]);
			holder.description.setText(description[position]);
			holder.status.setImageLevel(status[position]);
			holder.change.setVisibility(change[position] ? View.VISIBLE
					: View.GONE);

			return convertView;
		}

		/**
		 * Active les items pour les rendre clickables.
		 */
		@Override
		public boolean areAllItemsEnabled() {
			return true;
		}

	}

	/**
	 * Classe auxiliaire utilisée pour accéder aux champs d'un item de la liste.
	 * Stocke les résultats des appels à {@link View#findViewById(int)} afin de
	 * de ne devoir rechercher les champs à chaque mise à jour de la vue.
	 * 
	 * @author Michaël Schnell
	 * @since Jun 10, 2013
	 * 
	 * @version 1.0
	 */
	static class ViewHolder {
		int position;
		ImageView status;
		TextView name;
		TextView description;
		ImageView change;
	}

	public interface OnScheduleActionListener {
		public void showScheduleDetails(long scheduleId);

		public void showSchedule(long scheduleId);

		public void editSchedule(long scheduleId);

		public void refreshSchedule(long scheduleId);

		public void deleteSchedule(long scheduleId);
	}

}
